package com.blb.zy_community.service.impl;

import com.blb.zy_community.entity.SysMenu;
import com.blb.zy_community.mapper.SysMenuMapper;
import com.blb.zy_community.service.ISysMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * <p>
 * 菜单权限表 服务实现类
 * </p>
 *
 * @author 二组
 * @since 2023-06-18
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {
    @Autowired
    private SysMenuMapper sysMenuMapper;

    @Override
    public List<SysMenu> getSysMenuTree(Long menuId) {
        List<SysMenu> sysMenuTree =sysMenuMapper.selectMenuTree(menuId);
        return sysMenuTree;
    }

    @Override
    public List<SysMenu> getSystemMenuTreeWithCondition(long menuId, String menuName, String status) {
        List<SysMenu> sysMenuList= sysMenuMapper.selectMenuTreeWithCondition(menuId,menuName,status);
        return sysMenuList;
    }

    /**
     *根据用户名查询权限树
     * @param menuId    起始 父菜单id
     * @param username  用户名
     * @return
     */
    @Override
    public List<SysMenu> getSysMenuTreeByUsername(long menuId, String username) {
        List<SysMenu> sysMenuTree= sysMenuMapper.selectSysMenuTreeByUsername(menuId,username);
        return sysMenuTree;
    }

    /**
     * yty 新增
     * 根据菜单名和状态   系统菜单树做筛选
     * @param sysMenuTree   系统菜单树
     * @param menuName      菜单名
     * @param status        状态
     * @return
     */
    @Override
    public List<SysMenu> filterByMenuNameAndStatus(List<SysMenu> sysMenuTree, String menuName, String status) {
        ArrayList<SysMenu> newSysMenuArrayList = new ArrayList<>();

        //
        getTreeChild(sysMenuTree,newSysMenuArrayList,menuName,status);
        uniqueSysMenuList(newSysMenuArrayList,new ArrayList<Long>());
        return newSysMenuArrayList;
    }

    /**
     * yty 新增
     * 通过递归筛选树形数据
     * @param sysMenuTree       系统菜单树
     * @param newSysMenuTree    新的系统菜单树
     * @param menuName          条件--菜单名称
     * @param status            条件--菜单状态
     */
    public void getTreeChild(List<SysMenu> sysMenuTree,List<SysMenu> newSysMenuTree,String menuName, String status){
        //创建系统菜单的迭代器对象
        Iterator<SysMenu> iterator = sysMenuTree.iterator();
//        如果迭代器 下一个值不为空
        while (iterator.hasNext()){
//            拿到迭代器的下一个值
            SysMenu sysMenu = iterator.next();
//            如果  迭代到的当前的对象的 菜单名包含菜单名  并且  菜单状态满足条件    系统管理 系统  0   0
            if (sysMenu.getMenuName().contains(menuName)&&sysMenu.getStatus().equals(status)){
//                把当前对象添加到新的树
                newSysMenuTree.add(sysMenu);
            } else if (sysMenu.getMenuName().equals("")&&sysMenu.getStatus().equals(status)) {
                //可以不看
                newSysMenuTree.add(sysMenu);
            }
//            如果当前对象还有孩子
            if (sysMenu.getChildren()!=null){
//                递归调用自己
                getTreeChild(sysMenu.getChildren(),newSysMenuTree,menuName,status);
            }
//            如果当前对象不包含 菜单名 或 状态不满足条件
            if (!sysMenu.getMenuName().contains(menuName)||!sysMenu.getStatus().equals(status)){
//                删除当前对象
               iterator.remove();
            }
        }
    }

    /**
     * yty 新增
     * 根据菜单id从根节点去重
     * @param sysMenuList
     * @param set
     */
    public void uniqueSysMenuList(List<SysMenu> sysMenuList,List<Long> set){
        Iterator<SysMenu> iterator = sysMenuList.iterator();
        while (iterator.hasNext()){
            SysMenu sysMenu = iterator.next();
            if (sysMenu.getChildren()!=null){
                uniqueSysMenuList(sysMenu.getChildren(),set);
            }
            System.out.println(set.contains(sysMenu.getMenuId()));
            if (!set.contains(sysMenu.getMenuId())){
                set.add(sysMenu.getMenuId());
            }else {
                iterator.remove();
            }


        }


    }


}
